Amazon API Gateway のプライベート REST API でカスタムドメインが使えるようになっていたので設定してみた
いわさです。
API Gateway ではエンドポイントタイプというものがあり、エッジ・リージョナル・プライベートと選択することが出来ます。
API Gateway では通常はパブリックなエンドポイントを作成することが多いのですが、プライベートネットワーク内からのみアクセス出来る API を作成したい場合にプライベートエンドポイントタイプを選択することが出来ます。
よくあるユースケースとしてはオンプレミスから Direct Connect や VPN を経由して API Gateway を使うパターンです。
このプライベート API が、少し前の 2024 年 11 月のアップデートでカスタムドメインをサポートしました。
こちらのアップデートについて、ちょっと時間が経ってしまったのですが実際に作成して試す機会があったので紹介します。
これまではプライベート API のカスタムドメインはサポートされていなかった
実はこれまでプライベート API についてはカスタムドメインを使うことが出来ませんでした。
エッジやリージョナルなどのパブリック API の場合は使えました。
API Gateway では組み込みのカスタムドメイン機能を構成する際に ACM などの証明書を関連付けします。API Gateway は HTTPS が必須なので名前解決だけしてやっても組み込み機能が対応していないプライベート API では利用が出来ませんでした。
そのため、ワークアラウンドとしては以下の記事のようにカスタムドメインは NLB/ALB などを名前解決先とし、そのうしろに API Gateway にプロキシさせるような、多段でちょっと冗長な構成を取らざるを得ませんでした。
設定方法
ということで実際に設定してみましょう。
前提として、既にプライベート API を作成済みで、VPC 内の CloudShell からのみ VPC エンドポイント経由でアクセスが可能です。
API Gateway のカスタムドメイン名を追加
API Gateway の全体メニューに「カスタムドメイン」という機能が従来からあります。
まずはこちらで新しいドメインを追加します。
すると、次にようにカスタムドメインのタイプを選択出来るようになっていました。
従来のものが「パブリック」、今回新しく選択出来るようになったものが「プライベート」です。
ここではマッピングなどはまだ行わずに ACM 証明書だけ選択します。証明書はワイルドカードも選択出来ます。また、あとから変更も可能です。
カスタムドメインを作成したら、色々と設定を行っていきます。詳細画面を開きましょう。
まずは API マッピングを行います。
このあたりは従来のパブリックカスタムドメインを設定する場合と同じですね。
続いて、これはプライベートカスタムドメイン固有の新要素になりまして、リソース共有タブから「ドメイン名アクセスの関連付け」を行う必要があります。要はどの VPC エンドポイントからカスタムドメインを呼び出して良いかを関連付けという形で設定します。
設定は、プライベート API Gateway 構築時に作成済みのはずの VPC エンドポイントを指定するだけです。
この VPC エンドポイントのカスタムドメインですが、Route 53 プライベートホストゾーンで管理出来ます。厳密には VPC エンドポイントの IP アドレスへ、プライベートネットワーク内から名前解決出来れば OK です。
今回は API Gateway と CloudShell が存在する VPC に関連付けした Route 53 プライベートホストゾーンを作成しました。
でレコードを作成します。ここで注意点なのですがトラフィックルーティング先は API Gateway ではないのでご注意ください。プライベート API エンドポイントタイプの場合は選択肢に出てこないはずです。
ここで指定するのはプライベート API Gateway 用に作成した VPC エンドポイントのエイリアスになります。
さてここまでで設定は一通り終わりかな?と思って API にアクセスしてみたところUser: anonymous is not authorized to perform
というエラーが発生しました。権限がないようです。
[cloudshell-user@ip-10-0-136-248 ~]$ curl https://hoge0106api.tak1wa.com/
{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********7088:/domainnames/hoge0106api.tak1wa.com+ir41smqp82 with an explicit deny"}
上記ですが、拒否されているリソースをよく見るとカスタムドメインリソースに対して拒否されているのがわかります。
よく見てみるとカスタムドメイン詳細画面に次のようにリソースポリシータブがあります。従来のパブリックカスタムドメインではありませんでした。
上記がデフォルトでは ALL DENY になっています。
ここでは次の公式ドキュメントに従って、対象 VPC エンドポイント経由の場合に許可させます。
API Gateway のリソースポリシーとは別にカスタムドメイン自体にもリソースポリシーがあるという点を覚えておきましょう。
ここまで行って遂にプライベート API のカスタムドメイン対応が出来ました。やったー。
[cloudshell-user@ip-10-0-136-248 ~]$ curl https://hoge0106api.tak1wa.com/
{"hoge":"fuga"}
さいごに
本日は Amazon API Gateway のプライベート REST API でカスタムドメインが使えるようになっていたので設定してみました。
API Gateway でプライベートエンドポイントタイプを選択したことのある方は、カスタムドメインがサポートされていなかったことに悩んだ方多いのではないでしょうか。
追加料金も発生しないようですし、これは非常に良いアップデートですね。
NLB/ALB などを前段に配置している方は乗り換えを検討しても良いかもしれない。